\section*{Rohdaten Komponistenliste}

\subsection*{Aufgabenstellung}
Aus den Rohdaten der Komponistenliste, welche sich in verschiedenen
XML-Dateien (eine Datei für jeden Anfagsbuchstaben des Nachnamens)
befinden, soll eine XML-Datei erzeugt werden, in welche alle Daten
geschrieben werden, so dass eine einzige Datenbasis besteht.

\subsection*{Lösungsansatz}
Da es sich hierbei um eine Abfrage handelt, welche mehrere Dateien
einbezieht bietet sich XQuery an, da man mit dem Befehl collection()
mehrere Datein er Reihe nach durchlaufen kann. Ein Komponist wird auf
folgende Weise im Datenbestand repräsentiert:\\
\begin{lstlisting}[caption=Repräsentation des KomponistInnen im Datenbestand]
  <a href="URL">Name des Komponisten</a>
\end{lstlisting}
Bei der Analyse des Datenbestandes hat sich gezeigt, dass die
Repräsentationsformen der Namen der Komponisten nicht immer dieselben
sind.  Folgende Formen konnten extrahiert werden:\\
\begin{lstlisting}[caption=Repräsentationsformen des Strings]
Nachname
Nachname (Geburtsjahr-Todesjahr)
Nachname (geb. Geburtsjahr)
Nachname (Jahrhundert)

Nachname, Vorname
Nachname, Vorname (Geburtsjahr-Todesjahr)
Nachname, Vorname (geb. Geburtsjahr)
Nachname, Vorname (Jahrhundert)

Nachname, Vorname (2. Vorname)
Nachname, Vorname (2.Vorname) (Geburtsjahr-Todesjahr)
Nachname, Vorname (2. Vorname) (geb. Geburtsjahr)
Nachname, Vorname (2. Vorname) (Jahrhundert)
\end{lstlisting}
Das bedeuted, dass die verschiedenen Formen gefiltert werden müssen um
die richtigen Werte daraus zu extrahieren. Im Folgenden wird die
Struktur der neuen Komponisten-Datenbasis festgelegt:\\
\begin{lstlisting}[tabsize=2, caption=Repräsentation der
  KomponisteInnen in der neuen Datenbasis]
<Composers>
	<Composer>
		<Surname>Nachname</Surname>
		<Forename>Vorname</Forename>
		<YearOfBirth>Geburtsjahr</YearOfBirth>
		<YearOfDeath>Sterbejahr</YearOfDeath>
		<Century>Jahrhundert</Century>
		<InfoURI>URL</InfoURI>
	</Composer>
</Composers>
\end{lstlisting}
Tags welche nicht durch die XQuery-Anweisung erkannt werden, werden
nicht in das entsprechende Composer Element eingefügt. Falls z.B. nur
das Jahrhundert angegeben ist, gibt es YearOfBirth und YearOfDeath im
neuen Composer Element nicht.

\subsection*{Lösung}
Im Folgenden werden verschiedene wichtige Sequenzen der XQuery Abfrage
genauer erläutert. Zuerst werden 5 Funktionen definiert, welche den
String aus dem Datenbestand entgegennimmt und daraus das jeweilige
neue Element erzeugt. Die Funktionen lauten: extractForename,
extractSurname, extractYearOfBirth, extractYearOfDeath und
extractCentury. Der erste Befehl in jeder dieser Funktionen entfernt
aus dem String alle Zeilenumbrüche, da diese bei der weiteren
Verarbeitung stören.\\

\subsubsection*{extractForename}
\lstinputlisting[caption=extractForename, firstnumber=12,
linerange=12-26]{../Rohdaten_Komponisten/Komponisten.xquery} Zeile 17
entscheidet ob der String ein Komma enthält. Falls dieses Komma nicht
existiert, ist es unmöglich zu entscheiden was der Vorname und was der
Nachname ist, deshalb haben wir uns dazu entschieden in diesem Fall
nur einen Nachnamen anzugeben. Das bedeuted, falls das Komma nicht
vorhanden ist gibt die Funktion nichts zurück.

Zeile 18 sucht einen Klammerausdruck, welcher eine Zahl enthält. Ist
dies der Fall, entspricht alles zwischen dem Komma und der Klammer dem
Vornamen, falls nicht entspricht alles zwischen dem Komma und dem Ende
des Strings dem Vornamen.

\subsubsection*{extractSurename}
\lstinputlisting[caption=extractSurename, firstnumber=28,
linerange=28-45]{../Rohdaten_Komponisten/Komponisten.xquery} Zeile 33
entscheidet ob der String ein Komma enthält. Falls dieses Komma nicht
existiert, ist es unmöglich zu entscheiden was der Vorname und was der
Nachname ist, deshalb haben wir uns dazu entschieden in diesem Fall
nur einen Nachnamen anzugeben. Existiert dieses Komma, ist alles vom
Anfang des Strings bis zum Komma der Nachname.

Zeile 37 sucht einen Klamerausdruck, welcher eine Zahl enthält. Ist
dies der Fall, entspricht alles zwischen dem Anfang des Strings und
der Klammer dem Nachnamen, falls nicht entspricht alles zwischen dem
Komma und dem Ende des Strings dem Nachnamen.

\subsubsection*{extractYearOfBirth}
\lstinputlisting[caption=extractYearOfDeath, firstnumber=47,
linerange=47-62]{../Rohdaten_Komponisten/Komponisten.xquery} Zeile 51
sucht im String einen Klammerausdruck mit einer Zahl und ersetzt dann
den String mit diesem Klammerausdruck.

Zeile 53 untersucht ob der String einen Klamerausdruck mit einer Zahl
enthält, aber keinen Teilstring \glqq{}Jahrhundert\grqq{} besitzt.Nur
dann kann das Geburtsjahr bestimmt werden.

Zeile 54 entscheidet ob der String einen Teilstring \glqq{}geb.\grqq{}
enthält.  Ist dies der Fall entspricht alles zwischen
\glqq{}geb.\grqq{} und ) dem Geburtsjahr. Ist dies nicht der Fall
beschreibt alles zwischen der Klammer und dem Minus-Zeichen das
Geburtsjahr.

\subsubsection*{extractYearOfDeath}
\lstinputlisting[caption=extractYearOfBirth, firstnumber=64,
linerange=64-74]{../Rohdaten_Komponisten/Komponisten.xquery} Zeile 68
sucht im String einen Klammerausdruck mit einer Zahl und ersetzt dann
den String mit diesem Klammerausdruck.

Zeile 70 entscheidet, ob der String folgende drei Anforderungen erfüllt:
\begin{itemize}
\item Im String befindet sich ein Klammerausdruck mit einer Zahl
\item Im String befindet sich kein Teilstring
  \glqq{}geb.\grqq{}
\item Im String befindet sich kein Teilstring
  \glqq{}Jahrhundert\grqq{}
\end{itemize}
Sind die Anforderungen erfüllt entspricht alles zwischen dem
Minus-Zeichen und der Klammer dem Todesjahr.

\subsubsection*{extractCentury}
\lstinputlisting[caption=extractCentury, firstnumber=76,
linerange=76-86]{../Rohdaten_Komponisten/Komponisten.xquery} Zeile 80
sucht im String einen Klammerausdruck mit einer Zahl und ersetzt dann
den String mit diesem Klammerausdruck.

Zeile 82 sucht nach dem Teilstring \glqq{}Jahrhundert\grqq{}. Ist
dieser vorhanden entspricht die Zahl zwischen der Klammer und dem
Teilstring \glqq{}.  Jahrhundert\grqq{} dem Jahrhundert, in dem die
KomponistIn gelebt hat.

\subsubsection*{Main loop}
\lstinputlisting[caption=Main loop, firstnumber=90,
linerange=90-102]{../Rohdaten_Komponisten/Komponisten.xquery} Die
Schleife läuft durch alle Komponistenrepräsentationen in allen Dateien
im Verzeichnis Composers durch und führt die jeweiligen Funktionen aus
um die Daten zu erhalten. Auch die InfoURL wird in die neue Datenbasis
geschrieben.

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "../documentation"
%%% End: 
